home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene 96
/
Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso
/
misc
/
coding
/
sky3dngn
/
3dengine.txt
< prev
next >
Wrap
Text File
|
1996-10-07
|
14KB
|
295 lines
│███ │██ ██ │██ │██ │████████ │████████ │████████ │██ │██
└┐▀▓▓▄ │▓▓ ▄▓▓ └┐▓▓ │▓▓ └──────── └──────── └──────── │▓▓ │▓▓
└┐▀▒▒▄ │▒▒▒▒▒▀ └┐▒▒▒▒ │▒▒ │▒▒▒▒▒▒▒▒ │▒▒ │▒▒▒▒▒▒▒▒
└ ▄▄▌ └──┐▀▄▄ └─── │▀▀ │▄▄ ───── │▀▀ └────────
▄▄▄▄▓▓▓ └─┐▓▓ ▓▓ │▓▓ │▓▓▄▄▄▄▄▄ │▓▓▄▄▄▄▄▄ │▓▓ │▓▓
│▀▀▀▀▀ - │▀▀ │▀▀ │▀▀ │▀▀▀▀▀▀▀▀ │▀▀▀▀▀▀▀▀ │▀▀ │▀▀
└───── └── └── └── └──────── └──────── └── └──
│████████ │██████▄ │████████ ██ ██ │██████▄
│▓▓ └────┐▓▓▓ └──────── │▓▓ │▓▓ └────┐▓▓▓
│▒▒ │▒▒▒▒▒▒▄ │▒▒ ▒▒ │▒▒ │▒▒ ▓▓▓▓▓▓▀
│▀▀ │▀▀ └───┐▀▄▄ │▀▀ ▀▀ │▄▄▄ │▄▄ │▄▄ ──
│▓▓▄▄▄▄▓▓ └┐▓▓ │▓▓▄▄▄▄▓▓ │▀▓▓▓▓▓▓ │▓▓
│▀▀▀▀▀▀▀▀ │▀▀ │▀▀▀▀▀▀▀▀ └─┐ ▀▀▀▀ │▀▀
└──────── └── └──────── └───── └──
· ··---───==≡≡ Presents ≡≡==──----·· ·
3DEngine
Current Version : v1.0
3D Graphic Engine For The SkyTecH GrOuP
By The Unknown One
14/08/96
--
01/10/96
Index
Introduction
Introduction à 3DEngine
Structure POO
Description de la structure POO
Fichiers
Description des fichiers 3DT
Les calculs vectoriels
Description des méthodes de calcul 3D
La 3D
Algorythmes et méthodes de developpement 3D
Animation
Description des méthodes d'animation 3D
Tout le texte suivant se rapporte à 3DEngine v1.0. Pour les autres
versions, le numéro de version est précisé avant le texte.
Introduction
─────────────────────────────────────────────────────────────────────────────
3DEngine a pour but de devenir LE moteur graphique 3D de SkyTecH,
et ce pour tous les développements à venir (démos, jeux, programmes
ou autres).
3DEngine doit pour cela être doté d'une gestion à la fois simple,
puissante, et facile à intégrer dans un projet, quelqu'en soit la
nature. De plus, le code doit pouvoir être maintenu à jour par tous
les programmeurs du SkyTecH GrOuP le plus facilement possible. Ceci
requiert donc une grande lisibilité et clareté du code source. D'où
le choix de la Programmation Orientée Objet (POO).
De plus,3DEngine doit pouvoir permettre l'utilisation de nombreux
mode d'affichage pour les objets, donc de lissages, texturages, ...
le plus nombreux possible,d'où la necessité "d'entretient" du code.
Structure POO
─────────────────────────────────────────────────────────────────────────────
Cette POO se présente de la manière suivante :
- un objet principal, destiné à la gestion général du monde
virtuel géré par 3DEngine : l'objet TWORLD.
- un objet secondaire, destiné à gérer les vues du monde 3D des
objets TWORLD. Cet objet est en fait scindé en deux objets
distincts :
■ l'objet TCAMERA, destiné à gérer les vues de caméra en
mouvement (pas de Z_BUFFER)
■ l'objet TFIXEDVIEW, destiné à gérer les vues fixes des
mondes (repère fixé, gestion de Z_BUFFER)
ces objets sont indépendant du premier,car ils peuvent servir
à plusieurs mondes en même temps...
- un objet TLIST destiné à faire la liste des objets déclarés
dans un monde
- un objet TPATH destiné à l'animation des objets
- enfin, un objet T3DObject, en fait un RECORD, car les objets
n'ont pas à s'auto-gérer, car ils le sont par l'objet TWORLD
qui se sert des informations contenues par ce RECORD pour
effectuer toutes le opérations necessaire.
De plus, il est important de signaler que les données 3D des
objets ne sont EN AUCUN CAS modifiées par une fonction. Ainsi, les
données étant toujours invariables et donc sûres, nous pouvons nous
permettre de dupliquer un objet en donnant l'adresse de ses points
à un autre objet, qui alors prends l'apparence de celui-ci. Ceci
permet de réaliser des gains de mémoire non négligeables, et sans
de vitesse pour le moteur 3D.
Fonctions Utilitaires
3DEngine doit mettre à disposition de l'utilisateur de nombreuses
fonctions utilitaires pour être à même de réaliser tous les effets
voulus.
Parmis ces fonctions se trouvent :
- DuplicateObj : Crée un double d'un objet, possédant les mêmes
caractéristiques, les mêmes buffers pour les
points, les faces,... mais bénéficiant d'une
gestion propre des translations, rotations,...
- TranslateObj : Effectue une translation XYZ sur un objet
- RotateObj : Effectue une rotation XYZ sur un objet
- ScaleObj : Effectue un Scale XYZ sur un objet
- TranslateUni : Effectue une translation, utilisant les mêmes
valeurs pour X, Y, et Z sur un objet
- RotateUni : Effectue une rotation avec les mêmes valeurs
pour X, Y, et Z sur un objet
- ScaleUni : Effectue un Scale avec les mêmes valeurs pour
X, Y, et Z sur un objet (scale uniforme)
Description des objets
Les descriptions suivantes ont pour but d'expliquer le contenu de
chaque objet disponible dans 3DEngine et leur fonctionnement.
L'objet 3DObject
Cet objet est la base même de ce moteur 3D. En effet, il contient
toutes les informations se rapportant à un objet, aussi bien les
coordonnées de ses points que les buffers necessaires ou le type
de mapping à appliquer à cet objet. Ainsi, il contient toutes les
informations necessaires à sa gestion dans un monde en 3D, mais
aussi dans le monde 2D!
Les informations de 3DObject sont :
- X,Y,Z : LongInt avec les valeurs de translation
- RX,RY,RZ : Integer avec les valeurs de rotation
- Points : Pointeur sur les coordonnées 3D de l'objet
(COORDONNEES NON TRANSFORMEES!)
Format : [X,Y,Z,X,Y,Z,...] avec X, Y, et Z
en LongInt (32Bits)
- Faces : Pointeur sur les numéro des points des
faces de l'objet
Format : [A,B,C,A,B,C,...] avec A, B, et C
en Word (16Bits)
Les faces ne contiennent que 3 POINTS!!!
- Col : Pointeur sur les informations de couleur
de chaque point
Format : [A,A,A,...] avec A en LongInt
- ZList : Pointeur sur les valeurs moyennes Z des
faces de l'objet pour le tri en vue fixe
Format : [Z,Z,Z,...] avec Z en LongInt
- TransPoints : Pointeur sur les coordonnées 3D des points
de l'objet TRANSFORMES!
Format : Voir "Points"
- Points2D : Pointeur sur un buffer de projection pour
les valeurs 2D des points de l'objet
Format : [X,Y,X,Y,...] avec X et Y en Word
- MappingType : Word contenant le type de mapping pour
l'objet ainsi que ses attributs (cf "Algos
Utilisés")
- NbFaces : Word contenant le nombre de faces
- NbPoints : Word contenant le nombre de points
Fichiers
─────────────────────────────────────────────────────────────────────────────
Un moteur 3D necessite l'implémentation d'un format de fichier
pour stocker les données des objets et autres. Le format de fichier
retenu pour 3DEngine est le 3DT (3D Dad'n'TuO).
Ce format offre en effet plusieurs avantages non négligeables :
- il est en binaire, ce qui crée un gain de place énorme et
un vitesse de lecture accrue
- il a été créé par le SkyTecH GrOuP, donc les droits lui sont
acquis
- sa structure lui permet une grande facilité d'adaptation et
d'amélioration
Pour plus d'informations sur le format 3DT, reportez vous à la
section "Format 3DT".
Pour une plus grande souplesse d'utilisation, 3DEngine doit donc
se munir d'outils de conversion de formats divers vers le 3DT. Plus
le nombre de convertisseur sera élevé, plus la facilité de création
des mondes 3D sera accrue. Bien entendue, un convertisseur DOIT
fonctionner dans les deux sens.Les formats suivant doivent disposer
de leur convertisseur :
- DXF : Format de fichier universel
- 3DS : Format de fichier 3DStudio, bon modeleur
Les calculs vectoriels
─────────────────────────────────────────────────────────────────────────────
Les nombres en virgule fixe
Il existe deux types de calculs en virgule fixe que 3DEngine doit
effectuer : les calculs internes (fonctions triangle,...) et les
calculs généraux. Pour des raisons d'optimisation, les calculs en
virgule fixe internes sont executés en 16.16 bits, car ceci offre
plusieurs avantages: non seulement ils offrent une grande précision
mais en plus il sont les plus rapides à gérer en interne sans avoir
à recourir à une unité spécialisée.
Par contre, les calculs généraux en virgule fixe doivent passer
par un module spécialisée dans les calculs virgule fixe. Pour la
valeur de division, il faut compter 9bits (512) pour avoir une
précision suffisante sans pour autant réclamer trop de mémoire.
Les calculs vectoriels
Ces calculs peuvent passer par le module de virgule fixe pour
les calculs ayant besoin de précision.
Le module MATH
Ce module doit regrouper toutes les fonctions de calcul(vectoriel
et fixe) pour pouvoir être à la disposition de toutes les fonctions
pouvant en avoir besoin.
Ce module doit evidemment être écrit en ASSEMBLEUR pour un gain
de vitesse substantielle lors de calculs 3D.
La 3D
─────────────────────────────────────────────────────────────────────────────
Les algorythmes utilisés
Le but de 3DEngine étant d'être le plus complet possible tout en
êtant aussi le plus rapide. Pour cela, un grand nombre de lissages,
de méthodes de mapping de texture ou autre doit être implémenté.
De plus, un grand nombre de ces fonctions se présentent en double
ou en triple, mais en fait avec des versions différentes les unes
des autres : certaines sont plus rapides que d'autres,ces dernières
étant alors plus juste du point de vue du calcul 3D. Ceci permet
donc "d'optimiser" l'affichage d'un monde 3D: les objets peu ou pas
détaillés ne necessitant pas un lissage parfait seront alors plus
rapides à afficher, entrainant donc une acceleration générale du
monde 3D. Toutefois, l'appréciation est laissée aux développeurs,
car il n'est pas possible d'imposer une méthode pour un objet.
Voici donc la liste des lissages et texture mapping prévus :
- INVISIBLE (Tout simplement ignoré)
- DOTS (Les points affichés)
- Z_DOTS (Les points affichés, couleurs suivant Z)
- WIRE (En Wireframe - Fil de fer)
- FLAT (Face pleine;Gestion de l'illumination)
- GOURAUD (Méthode de Gouraud d'interpolation linéaire)
- Z_GOURAUD (Méthode de Gouraud en fonction de Z)
- PHONG (Méthode de Phong d'interpolation linéaire)
- TEXTMAP (Méthode de mapping 2D sur une surface)
- TEXTMAP3D (Méthode de mapping 3D sur une surface)
- GOURAUD MAPPING (Mapping de texture 2D avec Gouraud)
- Z_GOURAUD MAPPING (Mapping de texture 2D avec Z_GOURAUD)
- PHONG MAPPING (Mapping de texture 2D avec Phong)
- GOURAUD MAPPING 3D (Mapping de texture 3D avec Gouraud)
- Z_GOURAUD MAPPING 3D (Mapping de texture 3D avec Z_GOURAUD)
- PHONG MAPPING 3D (Mapping de texture 3D avec Phong)
- ENVIRONNEMENT MAPPING (Mapping d'environement)
De plus, plusieurs attributs se rajouteront à ces fonctions,
certains étant cumulables, d'autres non...
- Z_BUFFER (Gestion d'un Z_BUFFER)
- TRANSPARENT (Gestion de la transparence)
- INVISIBLE (L'objet n'est pas tracé; Cet attribut fait double
usage avec le mode INVISIBLE, mais il permet de
faire disparaitre des objets sans perdre leur type
de mapping)
Le tri des faces
Le tri des faces étant un point important d'un moteur 3D, car il
détermine sa vitesse par sa qualité et sa rapidité, il mérite une
étude approfondie du sujet. Toutefois,le but de cette documentation
n'est pas de fournir un catalogue d'algorythmes, mais une solution
pour la création d'un moteur 3D.
Voici donc la description de l'algorythme utilisé, avec toute la
justification pour son choix.
[...]
Animations
─────────────────────────────────────────────────────────────────────────────
KeyFrame
3DEngine se veut aussi un puissant module d'animation temps réel
des objets 3D. Ceci veut dire que les possibilités d'animation
doivent être simple d'utilisation, tout en offrant de très grandes
possiblités.
Pour cela, 3DEngine doit être doté d'un système de "KeyFrame" qui
permet une gestion poussée des mouvements d'un objet dans un monde
3D, et ce par l'intermediaire des transformations usuelles.
Toutefois,3DEngine se voit pour le moment réduit aux translations
et aux rotations.